// 标志
//
// @author noear
// @since 2.0

// 在 Rust 中，使用枚举来表示具有固定集合值的类型
#[derive(Debug, Clone, Copy, PartialEq)]
pub enum Flags {
    /**
     * 未知
     */
    Unknown = 0,
    /**
     * 连接
     * 握手：连接(c->s)，提交客户端握手信息，请求服务端握手信息
     */
    Connect = 10,
    /**
     * 连接确认
     * 握手：确认(c<-s)，响应服务端握手信息
     */
    Connack = 11,
    /**
     * Ping
     * 心跳:ping(c<->s)
     */
    Ping = 20,
    /**
     * Pong
     * 心跳:pong(c<->s)
     */
    Pong = 21,
    /**
     * 关闭（Udp 没有断链的概念，需要发消息）
     */
    Close = 30,
    /**
     * 告警
     */
    Alarm = 31,
    /**
     * 压力（预留做背压控制）
     */
    Pressure = 32,
    /**
     * 消息
     * 消息(c<->s)
     */
    Message = 40,
    /**
     * 请求
     * 请求(c<->s)
     */
    Request = 41,
    /**
     * 订阅
     */
    Subscribe = 42,
    /**
     * 答复
     */
    Reply = 48,
    /**
     * 答复结束（结束订阅接收）
     */
    ReplyEnd = 49,
}

impl Flags {
    /**
     * 根据 code 返回对应的 Flags 枚举
     *
     * @param code 传入的代码
     * @return 返回的 Flags 枚举
     */
    pub fn of(code: i32) -> Flags {
        match code {
            10 => Flags::Connect,
            11 => Flags::Connack,
            20 => Flags::Ping,
            21 => Flags::Pong,
            30 => Flags::Close,
            31 => Flags::Alarm,
            32 => Flags::Pressure,
            40 => Flags::Message,
            41 => Flags::Request,
            42 => Flags::Subscribe,
            48 => Flags::Reply,
            49 => Flags::ReplyEnd,
            _ => Flags::Unknown,
        }
    }

    /**
     * 返回 Flags 的名称
     *
     * @param code 传入的代码
     * @return 返回的名称
     */
    pub fn name(code: i32) -> &'static str {
        match code {
            Flags::Connect  => "Connect",
            Flags::Connack  => "Connack",
            Flags::Ping  => "Ping",
            Flags::Pong  => "Pong",
            Flags::Close  => "Close",
            Flags::Alarm  => "Alarm",
            Flags::Pressure  => "Pressure",
            Flags::Message  => "Message",
            Flags::Request  => "Request",
            Flags::Subscribe  => "Subscribe",
            Flags::Reply  => "Reply",
            Flags::ReplyEnd  => "ReplyEnd",
            _ => "Unknown",
        }
    }
}

// fn main() {
//     // 测试代码
//     let flag = Flags::of(10);
//     println!("Flag: {:?}, Name: {}", flag, Flags::name(flag 32));
//
//     let flag_name = Flags::name(42);
//     println!("Flag name: {}", flag_name);
// }